#include<bits/stdc++.h>
using namespace std;
const int maxn=4e2+2;
int n;
int cnt;
int p[maxn],hed[maxn];
long long ar[maxn],br[maxn];
long long sum,ans;
bool vis[maxn],use[maxn];
struct node_edge{
    int nxt,to;
}G[maxn*2];
void add(int u,int v){
    G[++cnt]=(node_edge){hed[u],v};
    hed[u]=cnt;
    return ;
}
void init(){
    for(int i=1;i<=n;i++)br[i]=ar[i],vis[i]=0;
    sum=0;
    return ;
}
void del(int x){
    sum+=br[x],vis[x]=1;
    for(int i=hed[x],v;i;i=G[i].nxt){
        v=G[i].to;
        if(vis[v])continue;
        br[v]+=br[x];
    }
    return ;
}
void sol(int x){
    if(x==n+1){
        init();
        for(int i=1;i<=n;i++)del(p[i]);
        ans=max(ans,sum);
        return ;
    }
    for(int i=1;i<=n;i++){
        if(use[i])continue;
        p[x]=i;
        use[i]=1;
        sol(x+1);
        use[i]=0;
    }
    return ;
}
int main(){
    freopen("light.in","r",stdin);
    freopen("light.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%lld",&ar[i]);
    }
    for(int i=1,u,v;i<n;i++){
        scanf("%d%d",&u,&v);
        add(u,v);
        add(v,u);
    }
    sol(1);
    printf("%lld\n",ans);
    return 0;
}